package com_.dxy_test_.bloom_filter_;

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;

import java.nio.charset.Charset;

public class BloomFilterTest {

    // 布隆过滤器适合大数据判重的场景，布隆过滤器判断不存在的，在数据库中一定不存在，但是判断存在，在数据库可能会不存在
    // 这就是会存在一定的误判率
    public static void main(String[] args) {
        // 第一个参数，Funnel是Guava中定义的一个接口，它和PrimitiveSink配套使用，主要是把任意类型的数据转化成HashCode (byte数组)。Guava预定义了一些原生类型的Funnel，如String、Long、Integer等等
        // 第二个参数，expectedInsertions是预期先存入值的数量
        // 第三个参数，fpp是误判率，默认是0.03
        BloomFilter<CharSequence> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charset.defaultCharset()), 1000, 0.00001);

        // 初始化，先维护数据库中已知存在的key值
        bloomFilter.put("guangzhou");
        bloomFilter.put("shenzhen");

        // 判断值是否在布隆过滤器器中
        System.out.println(bloomFilter.mightContain("guangzhou"));
        System.out.println(bloomFilter.mightContain("huizhou"));
    }
}
